home *** CD-ROM | disk | FTP | other *** search
/ ETO Development Tools 4 / ETO Development Tools 4.iso / Essentials / C++ A'Link Files / Mar 91 / CPlus.Dev$ 3⁄1⁄91 / 0281-PascalObject Initial-Feb91 < prev    next >
Text File  |  1991-04-01  |  2KB  |  57 lines

  1. Item    1272592                         25-Feb-91        15:22PST
  2.  
  3. From:   CPLUS.BUGS                      MPW C++ Bug Report Handler
  4.  
  5. To:     CPLUS.APPLE$                    C++ Interest List--Apple Employees
  6.         CPLUS.DEV$                      C++ Interest List--Developers
  7.  
  8. Item forwarded by       VIOLET.R     to AITKEN.K 
  9.  
  10. ------------------------------------------------------------------------------
  11.  
  12. Sub:    PascalObject Initialization
  13.  
  14. There are certain scenarios in which CFront will not properly initialize the
  15. method dispatch by failing to call '_PGM' from the programs 'main'. This only
  16. happens under the following circumstances:
  17.   • The code for main does not call any method belonging to a type derived from
  18. PascalObject, AND is in a compilation unit that has no code appearing before it
  19. that calls any method from a type derived from PascalObject.
  20.  
  21. Unfortunately merely including a call to operator new (i.e. instantiating an
  22. object) will not automatically trigger this since if the type in question has a
  23. constructor then operator new is actually called inside of the constructor. If
  24. you find yourself this situation where for example your 'main' simply calls
  25. some other routine which uses PascalObject methods then I suggest making an
  26. empty type -> class foo : public PascalObject { } . And including in your
  27. 'main' something like -> foo* afoo = new foo; . Since there is no constructor
  28. the compiler will see the call to operator new and include the call to _PGM.
  29.  
  30.  
  31.  
  32. Example of code that will not properly include the call to _PGM:
  33. ===============================================================================
  34. class foo : PascalObject {
  35.    public:
  36.    foo(void);
  37.    virtual void meth1(void);
  38. };
  39.  
  40. void non_member_func(foo* theClass);
  41.  
  42. void main()
  43. {
  44.    foo* afoo = new foo;
  45. non_member_func(afoo);
  46. }
  47.  
  48. foo::foo(void) { ; }
  49. void foo::meth1(void) { ; }
  50. // NOTE THE CODE THAT INVOKES THE METHOD COMES AFTER CODE FOR MAIN
  51. void non_member_func(foo* theClass)
  52. {
  53.    theClass->meth1();
  54. }
  55.  
  56.  
  57.